/**
 * Meituan.com Inc.
 * Copyright (c) 2010-2018 All Rights Reserved.
 */
package com.ticket.listener;

import com.ibm.jms.JMSBytesMessage;
import com.ticket.dao.IDbDAO;
import com.ticket.exception.ServiceException;
import com.ticket.pojo.ArrivalAtPort;
import com.ticket.pojo.DepartFromPort;
import com.ticket.service.IArrivalAtPortService;
import com.ticket.service.IDepartFromPortService;
import com.ticket.util.XMLUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.dom4j.DocumentException;

import javax.annotation.Resource;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
 * <p></p>
 *
 * @author tuyou@meitun.com
 * @version $Id: MqMessageListener.java, v 0.1 2018-08-16 11:00 tuyou $$
 */
public class MqMessageListener implements MessageListener {

    public static final Logger logger = Logger.getLogger(MqMessageListener.class);

    @Resource
    protected IDbDAO dbDAO;

    @Resource
    protected IArrivalAtPortService arrivalAtPortService;
    @Resource
    protected IDepartFromPortService departFromPortService;

    public void onMessage(Message message) {

        try {
            String messageText = getMessageString(message);
            if(StringUtils.isNotBlank(messageText)){
                logger.info("收到消息：" + messageText);

                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Map<String, String> map = XMLUtil.parseTomap(messageText);

                String direction = map.get("Direction"); //到离港标识
                String messageType = map.get("MessageType"); //消息类型	PREData KMGData
                String requestType = map.get("RequestType"); //请求类型	CreateOrUpdate（新增或更新）Delete（删除）
                if("KMGData".equals(messageType)){
                    String frs = map.get("FlightStatus");
                    String flt = map.get("FlightNo");
                    String flightDate = map.get("FlightDate");
                    Integer flightRepeat = StringUtils.isBlank(map.get("FlightRepeat")) ? 0 : Integer.parseInt(map.get("FlightRepeat"));

                    Date sta = StringUtils.isBlank(map.get("STA")) ? null : format.parse(map.get("STA"));

                    String DepCode = map.get("DepCode");
                    String ArrCode = map.get("ArrCode");
                    String gate = map.get("Gate");
//                            String btt = map.get("Baggage");
                    String stand = map.get("ArrStand");
//                            String boardStaus = map.get("BoardStaus");
                    String airNum = map.get("AirNum");
                    String caacCode = map.get("DelayCode"); //延误原因
//                            String vip = map.get("Vip");
                    String nat = map.get("NAT");
                    String fst = map.get("FST");
                    String cla = map.get("CLA");
                    String otc = map.get("OTC");
                    String org = map.get("ORG");
                    String des = map.get("DES");
                    String vi1 = map.get("VI1");
                    String vi2 = map.get("VI2");
                    String vi3 = map.get("VI3");
                    String vi4 = map.get("VI4");
                    String vi5 = map.get("VI5");
                    String vi6 = map.get("VI6");
                    String mFlightNo = map.get("MFlightNo");

                    String acw = null;
                    if (StringUtils.isNotBlank(flt) && flt.length() > 2) {
                        char c = flt.charAt(2);
                        if (((c <= 'Z') && (c >= 'A')) || ((c <= 'z') && (c >= 'a'))) {
                            acw = flt.substring(0, 3);
                        } else {
                            acw = flt.substring(0, 2);
                        }
                    }
                    String doi = map.get("TOF"); //航段性质标识	D（国内），I（国际），M（混合），R（地区）

                    //新加字段
//                    String IFC = map.get("IFC");
//                    String FLC = map.get("FLC");
                    Date ata = StringUtils.isBlank(map.get("ATA")) ? null : format.parse(map.get("ATA"));
                    String ITY = map.get("ITY");
//                    String LKF = map.get("LKF");

                    if("A".contains(direction)){
                        ArrivalAtPort port = arrivalAtPortService.queryByFlightNoAndDate(flt, flightDate);
                        if ("UpdateOrCreate".equals(requestType)) {
                            Date std = StringUtils.isBlank(map.get("STD")) ? null : format.parse(map.get("STD"));
                            Date tdt = StringUtils.isBlank(map.get("TDT")) ? null : format.parse(map.get("TDT"));
                            Date eta = StringUtils.isBlank(map.get("ETA")) ? null : format.parse(map.get("ETA"));

//                            Date abp = StringUtils.isBlank(map.get("ABP")) ? null : format.parse(map.get("ABP"));
//                            Date edp = StringUtils.isBlank(map.get("EDP")) ? null : format.parse(map.get("EDP"));
//                            Date stp = StringUtils.isBlank(map.get("STP")) ? null : format.parse(map.get("STP"));
//                            Date torg = StringUtils.isBlank(map.get("TORG")) ? null : format.parse(map.get("TORG"));

                            String CAR = map.get("CAR");
                            String CR2 = map.get("CR2");

                            boolean isCreate = false;
                            if (port == null) {
                                port = new ArrivalAtPort();
                                isCreate = true;
                            }
                            port.setFlt(flt);
                            port.setFlightDate(flightDate);
                            port.setFlightRepeat(flightRepeat);
                            port.setStd(std);
                            port.setSta(sta);
                            port.setTdt(tdt);
                            port.setEta(eta);
                            port.setDepCode(DepCode);
                            port.setArrCode(ArrCode);
                            port.setFrs(frs);
                            port.setGate(gate);
//                            port.setBtt(btt);
                            port.setStand(stand);
//                            port.setBoardStaus(boardStaus);
                            port.setAirnum(airNum);
                            port.setCaacCode(caacCode);
//                            port.setVip(vip);
                            port.setNat(nat);
                            port.setFst(fst);
                            port.setCla(cla);
                            port.setOtc(otc);
                            port.setOrg(org);
                            port.setDes(des);
                            port.setPft(vi1);
                            port.setPft2(vi2);
                            port.setPft3(vi3);
                            port.setPft4(vi4);
                            port.setPft5(vi5);
                            port.setPft6(vi6);
                            port.setmFlightNo(mFlightNo);
//                            port.setAbp(abp);
//                            port.setEdp(edp);
//                            port.setStp(stp);
//                            port.setTorg(torg);
                            port.setAcw(acw);
                            port.setDoi(doi);
//                            port.setIFC(IFC);
//                            port.setFLC(FLC);
                            port.setAta(ata);
                            port.setCAR(CAR);
                            port.setCR2(CR2);
                            port.setITY(ITY);
//                            port.setLKF(LKF);
                            if(isCreate){
                                arrivalAtPortService.persist(port);
                            }else{
                                arrivalAtPortService.merge(port);
                            }
                        }else if("Delete".equals(frs) && port != null){
                            dbDAO.remove(port);
                        }
                    }else if("D".contains(direction)){
                        Date std = StringUtils.isBlank(map.get("STD")) ? null : format.parse(map.get("STD"));
                        DepartFromPort port = departFromPortService.queryByFlightNoAndDate(flt, flightDate);

                        if ("UpdateOrCreate".equals(requestType)) {
                            Date ATD = StringUtils.isBlank(map.get("ATD")) ? null : format.parse( map.get("ATD"));
                            Date abt = StringUtils.isBlank(map.get("ABT")) ? null : format.parse( map.get("ABT"));
                            Date etd = StringUtils.isBlank(map.get("ETD")) ? null : format.parse( map.get("ETD"));
                            String cid =  map.get("CID");
//                            Date got = StringUtils.isBlank(map.get("GOT")) ? null : format.parse( map.get("GOT"));
//                            Date aan = StringUtils.isBlank(map.get("AAN")) ? null : format.parse( map.get("AAN"));
//                            Date ean = StringUtils.isBlank(map.get("EAN")) ? null : format.parse( map.get("EAN"));
//                            Date stn = StringUtils.isBlank(map.get("STN")) ? null : format.parse( map.get("STN"));
//                            Date tdes = StringUtils.isBlank(map.get("TDES")) ? null : format.parse( map.get("TDES"));

                            String CD2 = map.get("CD2");

                            boolean isCreate = false;
                            if (port == null) {
                                port = new DepartFromPort();
                                isCreate = true;
                            }
                            port.setFlt(flt);
                            port.setFlightDate(flightDate);
                            port.setFlightRepeat(flightRepeat);
                            port.setStd(std);
                            port.setSta(sta);
                            port.setAtd(ATD);
                            port.setAbt(abt);
                            port.setEtd(etd);
                            port.setArrCode(ArrCode);
                            port.setDepCode(DepCode);
                            port.setFrs(frs);
                            port.setGat(gate);
//                            port.setBaggage(Baggage);
                            port.setStand(stand);
//                            port.setBoardStaus(BoardStaus);
                            port.setAirnum(airNum);
                            port.setCaacCode(caacCode);
//                            port.setVip(Vip);
                            port.setNat(nat);
                            port.setFst(fst);
                            port.setCla(cla);
                            port.setOtc(otc);
                            port.setOrg(org);
                            port.setDes(des);
                            port.setVi1(vi1);
                            port.setVi2(vi2);
                            port.setVi3(vi3);
                            port.setVi4(vi4);
                            port.setVi5(vi5);
                            port.setVi6(vi6);
                            port.setmFlightNo(mFlightNo);
                            port.setCid(cid);
//                            port.setGot(got);
//                            port.setAan(aan);
//                            port.setEan(ean);
//                            port.setStn(stn);
//                            port.setTdes(tdes);
                            port.setDoi(doi);
                            port.setAcw(acw);
//                            port.setIFC(IFC);
//                            port.setFLC(FLC);
                            port.setAta(ata);
                            port.setITY(ITY);
//                            port.setLKF(LKF);
                            port.setCD2(CD2);
                            if (isCreate) {
                                departFromPortService.persist(port);
                            } else {
                                departFromPortService.merge(port);
                            }
                        }else if("Delete".equals(requestType) && port != null){
                            dbDAO.remove(port);
                        }
                    }
                }
            }
        } catch (JMSException e) {
            logger.error(e.getMessage(), e);
        } catch (DocumentException e) {
            logger.error(e.getMessage(), e);
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
        } catch (ParseException e) {
            logger.error(e.getMessage(), e);
        }
    }

    public static String getMessageString(Message message) throws JMSException {
        String m = null;
        if ((message instanceof TextMessage)) {
            m = ((TextMessage) message).getText();
        } else if ((message instanceof JMSBytesMessage)) {
            JMSBytesMessage bytesMessage = (JMSBytesMessage) message;
            byte[] bytes = new byte[(int) bytesMessage.getBodyLength()];
            bytesMessage.readBytes(bytes);
            m = new String(bytes);
        }
        return m;
    }
}